﻿//假设你写了一个简单的多线程模拟程序，模拟多个用户同时访问一个网站。
// 你想统计网站被访问的总次数。由于多个线程会同时增加访问计数器，必须用原子变量保证计数器的正确性。
#include <iostream>                  // 引入标准输入输出库，用于打印信息
#include <thread>                   // 引入多线程库 std::thread，用于创建和管理线程
#include <atomic>                   // 引入原子类型库 std::atomic，保证多线程操作数据的安全
#include <vector>                   // 引入向量容器，用于存储线程对象
#include <Windows.h>                // Windows 专用，用于设置控制台编码防止中文乱码
// 全局访问计数器，使用原子变量保证线程安全
std::atomic<int> visit_count(0);
// 模拟用户访问网站，每个线程调用该函数模拟多次访问
void simulate_user_visits(int visits_per_user) {
    for (int i = 0; i < visits_per_user; ++i) {
        ++visit_count;  // 对原子变量进行线程安全的自增操作
        std::this_thread::sleep_for(std::chrono::milliseconds(1)); // 模拟访问间隔，线程休眠1毫秒
    }
}

int main() {
    SetConsoleOutputCP(65001);              // 设置 Windows 控制台输出编码为 UTF-8，防止中文输出乱码
    const int user_threads = 5;             // 定义模拟的用户线程数量，这里为5个
    const int visits_per_user = 1000;       // 每个用户访问的次数，这里为1000次
    std::vector<std::thread> threads;       // 创建线程容器，存储多个线程对象
    // 启动多个用户线程模拟访问
    for (int i = 0; i < user_threads; ++i) {
        threads.emplace_back(simulate_user_visits, visits_per_user); // 创建线程并传入访问次数参数
    }
    // 等待所有线程完成
    for (auto& t : threads) {
        t.join();    // 主线程阻塞，等待每个子线程执行完毕
    }
    // 输出总访问量，预期为 user_threads * visits_per_user
    std::cout << "总访问量: " << visit_count << std::endl;
    return 0;  // 程序正常结束
}

